{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ecaf5e7b",
   "metadata": {},
   "source": [
    "## Res2net"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "bb53d3c8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Res2Net(\n",
      "  (conv1): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "  (relu): ReLU(inplace=True)\n",
      "  (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n",
      "  (layer1): Sequential(\n",
      "    (0): Res2NetBottleneck(\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(256, 16, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(16, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "    (1): Res2NetBottleneck(\n",
      "      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(256, 16, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(16, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "    (2): Res2NetBottleneck(\n",
      "      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(256, 16, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(16, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "  )\n",
      "  (layer2): Sequential(\n",
      "    (0): Res2NetBottleneck(\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2))\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(2, 2))\n",
      "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "    (1): Res2NetBottleneck(\n",
      "      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "    (2): Res2NetBottleneck(\n",
      "      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "    (3): Res2NetBottleneck(\n",
      "      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "  )\n",
      "  (layer3): Sequential(\n",
      "    (0): Res2NetBottleneck(\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2))\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(2, 2))\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(1024, 64, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(64, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "    (1): Res2NetBottleneck(\n",
      "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(1024, 64, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(64, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "    (2): Res2NetBottleneck(\n",
      "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(1024, 64, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(64, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "    (3): Res2NetBottleneck(\n",
      "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(1024, 64, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(64, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "    (4): Res2NetBottleneck(\n",
      "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(1024, 64, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(64, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "    (5): Res2NetBottleneck(\n",
      "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(1024, 64, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(64, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "  )\n",
      "  (layer4): Sequential(\n",
      "    (0): Res2NetBottleneck(\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2))\n",
      "        (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(2, 2))\n",
      "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(2048, 128, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(128, 2048, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "    (1): Res2NetBottleneck(\n",
      "      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(2048, 128, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(128, 2048, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "    (2): Res2NetBottleneck(\n",
      "      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "        (2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1))\n",
      "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (se): SEModule(\n",
      "        (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "        (fc1): Conv2d(2048, 128, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (relu): ReLU(inplace=True)\n",
      "        (fc2): Conv2d(128, 2048, kernel_size=(1, 1), stride=(1, 1))\n",
      "        (sigmoid): Sigmoid()\n",
      "      )\n",
      "    )\n",
      "  )\n",
      "  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "  (fc): Linear(in_features=2048, out_features=100, bias=True)\n",
      ")\n",
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "import torch.optim as optim\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "# 网络结构\n",
    "class SEModule(nn.Module):\n",
    "    def __init__(self, channels, reduction = 16):\n",
    "        super(SEModule, self).__init__()\n",
    "        self.avg_pool = nn.AdaptiveAvgPool2d(1)\n",
    "        self.fc1 = nn.Conv2d(channels, channels // reduction, kernel_size = 1, padding = 0)\n",
    "        self.relu = nn.ReLU(inplace=True)\n",
    "        self.fc2 = nn.Conv2d(channels // reduction, channels, kernel_size = 1, padding = 0)\n",
    "        self.sigmoid = nn.Sigmoid()\n",
    "\n",
    "    def forward(self, input):\n",
    "        x = self.avg_pool(input)\n",
    "        x = self.fc1(x)\n",
    "        x = self.relu(x)\n",
    "        x = self.fc2(x)\n",
    "        x = self.sigmoid(x)\n",
    "        return input * x\n",
    "    \n",
    "class Res2NetBottleneck(nn.Module):\n",
    "    expansion = 4\n",
    "    def __init__(self, inchannel, outchannel, downsample = None, stride = 1, scales = 4, groups = 1, se = True, norm_layer = True):\n",
    "        super(Res2NetBottleneck, self).__init__()\n",
    "        if outchannel % scales != 0:\n",
    "            raise ValueError('outchannel must be divisible by scales')\n",
    "        if norm_layer:\n",
    "            norm_layer = nn.BatchNorm2d\n",
    "        \n",
    "        bottleneck_channel = groups * outchannel\n",
    "        self.scales = scales\n",
    "        self.stride = stride\n",
    "        self.downsample = downsample\n",
    "        self.conv1 = nn.Conv2d(inchannel, bottleneck_channel, kernel_size = 1, stride = stride)\n",
    "        self.bn1 = norm_layer(bottleneck_channel)\n",
    "        self.conv2 = nn.ModuleList([nn.Conv2d(bottleneck_channel // scales, bottleneck_channel // scales, kernel_size = 3, stride = 1, padding = 1, groups = groups) for _ in range(scales - 1)])\n",
    "        self.bn2 = nn.ModuleList([norm_layer(bottleneck_channel // scales) for _ in range(scales - 1)])\n",
    "        self.conv3 = nn.Conv2d(bottleneck_channel, outchannel * self.expansion, kernel_size = 1, stride = 1)\n",
    "        self.bn3 = norm_layer(outchannel * self.expansion)\n",
    "        self.relu = nn.ReLU(inplace = True)\n",
    "        self.se = SEModule(outchannel * self.expansion) if se else None\n",
    "\n",
    "    def forward(self, x):\n",
    "        identity = x\n",
    "        out = self.conv1(x)\n",
    "        out = self.bn1(out)\n",
    "        out = self.relu(out)\n",
    "\n",
    "        xs = torch.chunk(out, self.scales, 1)\n",
    "        ys = []\n",
    "        for s in range(self.scales):\n",
    "            if s == 0:\n",
    "                ys.append(xs[s])\n",
    "            elif s == 1:\n",
    "                ys.append(self.relu(self.bn2[s-1](self.conv2[s-1](xs[s]))))\n",
    "            else:\n",
    "                ys.append(self.relu(self.bn2[s-1](self.conv2[s-1](xs[s] + ys[-1]))))\n",
    "        out = torch.cat(ys, 1)\n",
    "\n",
    "        out = self.conv3(out)\n",
    "        out = self.bn3(out)\n",
    "\n",
    "        if self.se is not None:\n",
    "            out = self.se(out)\n",
    "        \n",
    "        if self.downsample:\n",
    "            identity = self.downsample(identity)\n",
    "        out += identity\n",
    "        out = self.relu(out)\n",
    "        return out\n",
    "    \n",
    "class Res2Net(nn.Module):\n",
    "    def __init__(self, layers, num_classes = 100, width = 16, scales = 4, groups = 1, zero_init_residual = True, se = True, norm_layer = True):\n",
    "        super(Res2Net, self).__init__()\n",
    "        if norm_layer:\n",
    "            norm_layer = nn.BatchNorm2d\n",
    "        outchannel = [int(width * scales * 2 ** i) for i in range(4)]\n",
    "        self.inchannel = outchannel[0]\n",
    "\n",
    "        self.conv1 = nn.Conv2d(3, outchannel[0], kernel_size = 3, stride = 1, padding = 1, bias = False)\n",
    "        self.bn1 = norm_layer(outchannel[0])\n",
    "        self.relu = nn.ReLU(inplace = True)\n",
    "        self.maxpool = nn.MaxPool2d(kernel_size = 3, stride = 2, padding = 1)\n",
    "        #四个残差块\n",
    "        self.layer1 = self._make_layer(Res2NetBottleneck, outchannel[0], layers[0], stride=1, scales=scales, groups=groups, se=se, norm_layer=norm_layer)\n",
    "        self.layer2 = self._make_layer(Res2NetBottleneck, outchannel[1], layers[1], stride=2, scales=scales, groups=groups, se=se, norm_layer=norm_layer)\n",
    "        self.layer3 = self._make_layer(Res2NetBottleneck, outchannel[2], layers[2], stride=2, scales=scales, groups=groups, se=se, norm_layer=norm_layer)\n",
    "        self.layer4 = self._make_layer(Res2NetBottleneck, outchannel[3], layers[3], stride=2, scales=scales, groups=groups, se=se, norm_layer=norm_layer)\n",
    "        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))\n",
    "        self.fc = nn.Linear(outchannel[3] * Res2NetBottleneck.expansion, num_classes)\n",
    "\n",
    "        #初始化\n",
    "        for m in self.modules():\n",
    "            if isinstance(m, nn.Conv2d):\n",
    "                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity = 'relu')\n",
    "            elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)):\n",
    "                nn.init.constant_(m.weight, 1)\n",
    "                nn.init.constant_(m.bias, 0)\n",
    "        #零初始化每个剩余分支中的最后一个BN，以便剩余分支从零开始，并且每个剩余块的行为类似于一个恒等式\n",
    "        if zero_init_residual:\n",
    "            for m in self.modules():\n",
    "                if isinstance(m, Res2NetBottleneck):\n",
    "                    nn.init.constant_(m.bn3.weight, 0)\n",
    "\n",
    "    def _make_layer(self, block, outchannel, blocks, stride = 1, scales = 4, groups = 1, se = True, norm_layer = True):\n",
    "        if norm_layer:\n",
    "            norm_layer = nn.BatchNorm2d\n",
    "        downsample = None\n",
    "        if stride != 1 or self.inchannel != outchannel * block.expansion:\n",
    "            downsample = nn.Sequential(nn.Conv2d(self.inchannel, outchannel * block.expansion, kernel_size = 1, stride = stride),\n",
    "                                       norm_layer(outchannel * block.expansion))\n",
    "\n",
    "        layers = []\n",
    "        layers.append(block(self.inchannel, outchannel, downsample, stride = stride, scales = scales, groups = groups, se = se, norm_layer = norm_layer))\n",
    "        self.inchannel = outchannel * block.expansion\n",
    "        for _ in range(1, blocks):\n",
    "            layers.append(block(self.inchannel, outchannel, scales = scales, groups = groups, se = se, norm_layer=norm_layer))\n",
    "        \n",
    "        return nn.Sequential(*layers)\n",
    "    \n",
    "    def forward(self, x):\n",
    "        x = self.conv1(x)\n",
    "        x = self.bn1(x)\n",
    "        x = self.relu(x)\n",
    "        x = self.maxpool(x)\n",
    "\n",
    "        x = self.layer1(x)\n",
    "        x = self.layer2(x)\n",
    "        x = self.layer3(x)\n",
    "        x = self.layer4(x)\n",
    "\n",
    "        x = self.avgpool(x)\n",
    "        x = x.view(x.size(0), -1)\n",
    "        logits = self.fc(x)\n",
    "        probas = nn.functional.softmax(logits, dim = 1)\n",
    "        return probas\n",
    "\n",
    "net = Res2Net([3,4,6,3])\n",
    "#如果有gpu就使用gpu，否则使用cpu\n",
    "device = torch.device('cuda'if torch.cuda.is_available() else 'cpu')\n",
    "net = net.to(device)\n",
    "print(net)\n",
    "\n",
    "#加载数据集\n",
    "transform_train = transforms.Compose([\n",
    "    transforms.RandomCrop(32, padding=4),\n",
    "    transforms.RandomHorizontalFlip(),\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize(mean=[0.5071, 0.4865, 0.4409], std=[0.2673, 0.2564, 0.2762])\n",
    "])\n",
    "transform_test = transforms.Compose([\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize(mean=[0.5071, 0.4865, 0.4409], std=[0.2673, 0.2564, 0.2762])\n",
    "])\n",
    "\n",
    "train_dataset = torchvision.datasets.cifar.CIFAR100(root='./data/cifar100', train=True, transform=transform_train, download=True)\n",
    "test_dataset = torchvision.datasets.cifar.CIFAR100(root='./data/cifar100', train=False, transform=transform_test, download=True)\n",
    "\n",
    "train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=128, shuffle=True)\n",
    "test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=256, shuffle=False)\n",
    "\n",
    "\n",
    "#如果有gpu就使用gpu，否则使用cpu\n",
    "device = torch.device('cuda'if torch.cuda.is_available() else 'cpu')\n",
    "net = net.to(device)\n",
    "\n",
    "\n",
    "#超参数设置\n",
    "epochs = 20\n",
    "BATCH_SIZE = 128\n",
    "LR = 0.01\n",
    "\n",
    "#定义损失函数和优化器\n",
    "criterion = torch.nn.CrossEntropyLoss()\n",
    "optimizer = optim.SGD(net.parameters(), lr=LR, momentum=0.9, weight_decay=5e-4)\n",
    "# optimizer = torch.optim.Adam(net.parameters(), lr=0.001,weight_decay=5e-4)\n",
    "\n",
    "# 训练网络\n",
    "def train(epoch, log_interval=128):\n",
    "    # Set model to training model\n",
    "    net.train()\n",
    "    for batch_idx, (data, target) in enumerate(train_loader):\n",
    "        # Copy data to GPU if needed\n",
    "        data = data.to(device)\n",
    "        target = target.to(device)\n",
    "        \n",
    "        # Zero gradient buffers\n",
    "        optimizer.zero_grad()\n",
    "        # Pass data through the network\n",
    "        output = net(data)\n",
    "        # Calculate loss\n",
    "        loss = criterion(output, target)\n",
    "        # Backpropagate\n",
    "        loss.backward()\n",
    "        # Update weights\n",
    "        optimizer.step()\n",
    "        \n",
    "        if batch_idx % log_interval == 0:\n",
    "            print('Train Epoch: {} [{}/{} ({:.0f}%)]\\tLoss: {:.6f}'.format(epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), loss.data.item()))\n",
    "\n",
    "\n",
    "def validate(loss_vector, accuracy_vector):\n",
    "    net.eval()\n",
    "    val_loss, correct = 0, 0\n",
    "    for data, target in test_loader:\n",
    "        data = data.to(device)\n",
    "        target = target.to(device)\n",
    "        output = net(data)\n",
    "        val_loss += criterion(output, target).data.item()\n",
    "        pred = output.data.max(1)[1]\n",
    "        correct += pred.eq(target.data).cpu().sum()\n",
    "    \n",
    "    val_loss /= len(test_loader)\n",
    "    loss_vector.append(val_loss)\n",
    "    \n",
    "    accuracy = 100. * correct.to(torch.float32) / len(test_loader.dataset)\n",
    "    accuracy_vector.append(accuracy)\n",
    "    \n",
    "    print('\\nValidation set: Average loss: {:.4f}, Accuracy: {}/{} ({:.04f}%)\\n'.format(val_loss, correct, len(test_loader.dataset), accuracy))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a527ebfa",
   "metadata": {},
   "source": [
    "## Train for Xunjian"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f2dbd870",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train Epoch: 1 [0/50000 (0%)]\tLoss: 4.604927\n",
      "Train Epoch: 1 [16384/50000 (33%)]\tLoss: 4.605030\n",
      "Train Epoch: 1 [32768/50000 (65%)]\tLoss: 4.604233\n",
      "Train Epoch: 1 [49152/50000 (98%)]\tLoss: 4.605561\n",
      "\n",
      "Validation set: Average loss: 4.6023, Accuracy: 104/10000 (1.0400%)\n",
      "\n",
      "Train Epoch: 2 [0/50000 (0%)]\tLoss: 4.605165\n",
      "Train Epoch: 2 [16384/50000 (33%)]\tLoss: 4.598008\n",
      "Train Epoch: 2 [32768/50000 (65%)]\tLoss: 4.586503\n",
      "Train Epoch: 2 [49152/50000 (98%)]\tLoss: 4.601414\n",
      "\n",
      "Validation set: Average loss: 4.5866, Accuracy: 319/10000 (3.1900%)\n",
      "\n",
      "Train Epoch: 3 [0/50000 (0%)]\tLoss: 4.599090\n",
      "Train Epoch: 3 [16384/50000 (33%)]\tLoss: 4.586838\n",
      "Train Epoch: 3 [32768/50000 (65%)]\tLoss: 4.578549\n",
      "Train Epoch: 3 [49152/50000 (98%)]\tLoss: 4.581113\n",
      "\n",
      "Validation set: Average loss: 4.5830, Accuracy: 351/10000 (3.5100%)\n",
      "\n",
      "Train Epoch: 4 [0/50000 (0%)]\tLoss: 4.587667\n",
      "Train Epoch: 4 [16384/50000 (33%)]\tLoss: 4.590812\n",
      "Train Epoch: 4 [32768/50000 (65%)]\tLoss: 4.591835\n",
      "Train Epoch: 4 [49152/50000 (98%)]\tLoss: 4.574572\n",
      "\n",
      "Validation set: Average loss: 4.5806, Accuracy: 386/10000 (3.8600%)\n",
      "\n",
      "Train Epoch: 5 [0/50000 (0%)]\tLoss: 4.549657\n",
      "Train Epoch: 5 [16384/50000 (33%)]\tLoss: 4.570830\n",
      "Train Epoch: 5 [32768/50000 (65%)]\tLoss: 4.597825\n",
      "Train Epoch: 5 [49152/50000 (98%)]\tLoss: 4.589918\n",
      "\n",
      "Validation set: Average loss: 4.5778, Accuracy: 407/10000 (4.0700%)\n",
      "\n",
      "Train Epoch: 6 [0/50000 (0%)]\tLoss: 4.587021\n",
      "Train Epoch: 6 [16384/50000 (33%)]\tLoss: 4.582839\n",
      "Train Epoch: 6 [32768/50000 (65%)]\tLoss: 4.576197\n",
      "Train Epoch: 6 [49152/50000 (98%)]\tLoss: 4.572966\n",
      "\n",
      "Validation set: Average loss: 4.5758, Accuracy: 457/10000 (4.5700%)\n",
      "\n",
      "Train Epoch: 7 [0/50000 (0%)]\tLoss: 4.571798\n",
      "Train Epoch: 7 [16384/50000 (33%)]\tLoss: 4.570232\n",
      "Train Epoch: 7 [32768/50000 (65%)]\tLoss: 4.588946\n",
      "Train Epoch: 7 [49152/50000 (98%)]\tLoss: 4.576803\n",
      "\n",
      "Validation set: Average loss: 4.5737, Accuracy: 481/10000 (4.8100%)\n",
      "\n",
      "Train Epoch: 8 [0/50000 (0%)]\tLoss: 4.597890\n",
      "Train Epoch: 8 [16384/50000 (33%)]\tLoss: 4.592239\n",
      "Train Epoch: 8 [32768/50000 (65%)]\tLoss: 4.566806\n",
      "Train Epoch: 8 [49152/50000 (98%)]\tLoss: 4.569288\n",
      "\n",
      "Validation set: Average loss: 4.5713, Accuracy: 503/10000 (5.0300%)\n",
      "\n",
      "Train Epoch: 9 [0/50000 (0%)]\tLoss: 4.586541\n",
      "Train Epoch: 9 [16384/50000 (33%)]\tLoss: 4.582604\n",
      "Train Epoch: 9 [32768/50000 (65%)]\tLoss: 4.569084\n",
      "Train Epoch: 9 [49152/50000 (98%)]\tLoss: 4.589888\n",
      "\n",
      "Validation set: Average loss: 4.5704, Accuracy: 510/10000 (5.1000%)\n",
      "\n",
      "Train Epoch: 10 [0/50000 (0%)]\tLoss: 4.570744\n",
      "Train Epoch: 10 [16384/50000 (33%)]\tLoss: 4.569218\n",
      "Train Epoch: 10 [32768/50000 (65%)]\tLoss: 4.558080\n",
      "Train Epoch: 10 [49152/50000 (98%)]\tLoss: 4.569068\n",
      "\n",
      "Validation set: Average loss: 4.5683, Accuracy: 528/10000 (5.2800%)\n",
      "\n",
      "Train Epoch: 11 [0/50000 (0%)]\tLoss: 4.587680\n",
      "Train Epoch: 11 [16384/50000 (33%)]\tLoss: 4.548002\n",
      "Train Epoch: 11 [32768/50000 (65%)]\tLoss: 4.564857\n",
      "Train Epoch: 11 [49152/50000 (98%)]\tLoss: 4.544870\n",
      "\n",
      "Validation set: Average loss: 4.5690, Accuracy: 523/10000 (5.2300%)\n",
      "\n",
      "Train Epoch: 12 [0/50000 (0%)]\tLoss: 4.566720\n",
      "Train Epoch: 12 [16384/50000 (33%)]\tLoss: 4.553646\n",
      "Train Epoch: 12 [32768/50000 (65%)]\tLoss: 4.544235\n",
      "Train Epoch: 12 [49152/50000 (98%)]\tLoss: 4.581301\n",
      "\n",
      "Validation set: Average loss: 4.5661, Accuracy: 552/10000 (5.5200%)\n",
      "\n",
      "Train Epoch: 13 [0/50000 (0%)]\tLoss: 4.576840\n",
      "Train Epoch: 13 [16384/50000 (33%)]\tLoss: 4.581285\n",
      "Train Epoch: 13 [32768/50000 (65%)]\tLoss: 4.583283\n",
      "Train Epoch: 13 [49152/50000 (98%)]\tLoss: 4.594981\n",
      "\n",
      "Validation set: Average loss: 4.5659, Accuracy: 556/10000 (5.5600%)\n",
      "\n",
      "Train Epoch: 14 [0/50000 (0%)]\tLoss: 4.574988\n",
      "Train Epoch: 14 [16384/50000 (33%)]\tLoss: 4.534039\n",
      "Train Epoch: 14 [32768/50000 (65%)]\tLoss: 4.533628\n",
      "Train Epoch: 14 [49152/50000 (98%)]\tLoss: 4.539618\n",
      "\n",
      "Validation set: Average loss: 4.5649, Accuracy: 563/10000 (5.6300%)\n",
      "\n",
      "Train Epoch: 15 [0/50000 (0%)]\tLoss: 4.585522\n",
      "Train Epoch: 15 [16384/50000 (33%)]\tLoss: 4.581789\n",
      "Train Epoch: 15 [32768/50000 (65%)]\tLoss: 4.554395\n",
      "Train Epoch: 15 [49152/50000 (98%)]\tLoss: 4.570892\n",
      "\n",
      "Validation set: Average loss: 4.5640, Accuracy: 581/10000 (5.8100%)\n",
      "\n",
      "Train Epoch: 16 [0/50000 (0%)]\tLoss: 4.536852\n",
      "Train Epoch: 16 [16384/50000 (33%)]\tLoss: 4.566987\n",
      "Train Epoch: 16 [32768/50000 (65%)]\tLoss: 4.562890\n",
      "Train Epoch: 16 [49152/50000 (98%)]\tLoss: 4.583652\n",
      "\n",
      "Validation set: Average loss: 4.5637, Accuracy: 572/10000 (5.7200%)\n",
      "\n",
      "Train Epoch: 17 [0/50000 (0%)]\tLoss: 4.566271\n",
      "Train Epoch: 17 [16384/50000 (33%)]\tLoss: 4.577793\n",
      "Train Epoch: 17 [32768/50000 (65%)]\tLoss: 4.571199\n",
      "Train Epoch: 17 [49152/50000 (98%)]\tLoss: 4.586869\n",
      "\n",
      "Validation set: Average loss: 4.5603, Accuracy: 623/10000 (6.2300%)\n",
      "\n",
      "Train Epoch: 18 [0/50000 (0%)]\tLoss: 4.553047\n",
      "Train Epoch: 18 [16384/50000 (33%)]\tLoss: 4.540304\n",
      "Train Epoch: 18 [32768/50000 (65%)]\tLoss: 4.573334\n",
      "Train Epoch: 18 [49152/50000 (98%)]\tLoss: 4.521103\n",
      "\n",
      "Validation set: Average loss: 4.5597, Accuracy: 604/10000 (6.0400%)\n",
      "\n",
      "Train Epoch: 19 [0/50000 (0%)]\tLoss: 4.603860\n",
      "Train Epoch: 19 [16384/50000 (33%)]\tLoss: 4.556820\n",
      "Train Epoch: 19 [32768/50000 (65%)]\tLoss: 4.550557\n",
      "Train Epoch: 19 [49152/50000 (98%)]\tLoss: 4.584321\n",
      "\n",
      "Validation set: Average loss: 4.5602, Accuracy: 609/10000 (6.0900%)\n",
      "\n",
      "Train Epoch: 20 [0/50000 (0%)]\tLoss: 4.548139\n",
      "Train Epoch: 20 [16384/50000 (33%)]\tLoss: 4.580292\n",
      "Train Epoch: 20 [32768/50000 (65%)]\tLoss: 4.575620\n",
      "Train Epoch: 20 [49152/50000 (98%)]\tLoss: 4.551985\n",
      "\n",
      "Validation set: Average loss: 4.5581, Accuracy: 628/10000 (6.2800%)\n",
      "\n",
      "Finished Training\n",
      "训练损失:4.558101916313172\n",
      "训练精确度:6.28000020980835%\n"
     ]
    },
    {
     "ename": "FileNotFoundError",
     "evalue": "[Errno 2] No such file or directory: 'figs/Res2net50_e20_loss.png'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_394/3828051908.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     12\u001b[0m     \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mepochs\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlossv\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     13\u001b[0m     \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtitle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'validation loss'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m     \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msavefig\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'figs/Res2net50_e20_loss.png'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     15\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     16\u001b[0m     \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/lib/python3.8/site-packages/matplotlib/pyplot.py\u001b[0m in \u001b[0;36msavefig\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    956\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0msavefig\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    957\u001b[0m     \u001b[0mfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgcf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 958\u001b[0;31m     \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msavefig\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    959\u001b[0m     \u001b[0mfig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcanvas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdraw_idle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m   \u001b[0;31m# need this if 'transparent=True' to reset colors\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    960\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mres\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/lib/python3.8/site-packages/matplotlib/figure.py\u001b[0m in \u001b[0;36msavefig\u001b[0;34m(self, fname, transparent, **kwargs)\u001b[0m\n\u001b[1;32m   3010\u001b[0m                         ax.patch._cm_set(facecolor='none', edgecolor='none'))\n\u001b[1;32m   3011\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3012\u001b[0;31m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcanvas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprint_figure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   3013\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3014\u001b[0m     def ginput(self, n=1, timeout=30, show_clicks=True,\n",
      "\u001b[0;32m~/miniconda3/lib/python3.8/site-packages/matplotlib/backend_bases.py\u001b[0m in \u001b[0;36mprint_figure\u001b[0;34m(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)\u001b[0m\n\u001b[1;32m   2312\u001b[0m                 \u001b[0;31m# force the figure dpi to 72), so we need to set it again here.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2313\u001b[0m                 \u001b[0;32mwith\u001b[0m \u001b[0mcbook\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_setattr_cm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdpi\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdpi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2314\u001b[0;31m                     result = print_method(\n\u001b[0m\u001b[1;32m   2315\u001b[0m                         \u001b[0mfilename\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2316\u001b[0m                         \u001b[0mfacecolor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfacecolor\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/lib/python3.8/site-packages/matplotlib/backend_bases.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m   1641\u001b[0m             \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1642\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1643\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1644\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1645\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/lib/python3.8/site-packages/matplotlib/_api/deprecation.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*inner_args, **inner_kwargs)\u001b[0m\n\u001b[1;32m    410\u001b[0m                          \u001b[0;32melse\u001b[0m \u001b[0mdeprecation_addendum\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    411\u001b[0m                 **kwargs)\n\u001b[0;32m--> 412\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minner_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0minner_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    413\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    414\u001b[0m     \u001b[0mDECORATORS\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mwrapper\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdecorator\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/lib/python3.8/site-packages/matplotlib/backends/backend_agg.py\u001b[0m in \u001b[0;36mprint_png\u001b[0;34m(self, filename_or_obj, metadata, pil_kwargs, *args)\u001b[0m\n\u001b[1;32m    539\u001b[0m         \"\"\"\n\u001b[1;32m    540\u001b[0m         \u001b[0mFigureCanvasAgg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdraw\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 541\u001b[0;31m         mpl.image.imsave(\n\u001b[0m\u001b[1;32m    542\u001b[0m             \u001b[0mfilename_or_obj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuffer_rgba\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mformat\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"png\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morigin\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"upper\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    543\u001b[0m             dpi=self.figure.dpi, metadata=metadata, pil_kwargs=pil_kwargs)\n",
      "\u001b[0;32m~/miniconda3/lib/python3.8/site-packages/matplotlib/image.py\u001b[0m in \u001b[0;36mimsave\u001b[0;34m(fname, arr, vmin, vmax, cmap, format, origin, dpi, metadata, pil_kwargs)\u001b[0m\n\u001b[1;32m   1673\u001b[0m         \u001b[0mpil_kwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msetdefault\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"format\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mformat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1674\u001b[0m         \u001b[0mpil_kwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msetdefault\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"dpi\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mdpi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdpi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1675\u001b[0;31m         \u001b[0mimage\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msave\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mpil_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1676\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1677\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/lib/python3.8/site-packages/PIL/Image.py\u001b[0m in \u001b[0;36msave\u001b[0;34m(self, fp, format, **params)\u001b[0m\n\u001b[1;32m   2235\u001b[0m                 \u001b[0mfp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbuiltins\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilename\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"r+b\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2236\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2237\u001b[0;31m                 \u001b[0mfp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbuiltins\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilename\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"w+b\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2238\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2239\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'figs/Res2net50_e20_loss.png'"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "if __name__ == \"__main__\":\n",
    "    lossv, accv = [], []\n",
    "    for epoch in range(1, epochs + 1):\n",
    "        train(epoch)\n",
    "        validate(lossv, accv)\n",
    "\n",
    "    print('Finished Training')\n",
    "\n",
    "    # 绘制训练损失、精确度\n",
    "    print(\"训练损失:{}\\n训练精确度:{}%\".format(lossv[-1], accv[-1].item()))\n",
    "    plt.figure(figsize=(5,3))\n",
    "    plt.plot(np.arange(1,epochs+1), lossv)\n",
    "    plt.title('validation loss')\n",
    "    plt.savefig('figs/Res2net50_e20_loss.png')\n",
    "    \n",
    "    plt.figure(figsize=(5,3))\n",
    "    plt.plot(np.arange(1,epochs+1), accv)\n",
    "    plt.title('validation accuracy')\n",
    "    plt.savefig('figs/Res2net50_e20_accuracy.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "429f2161-fc93-4e05-93ee-be3a74b54cb5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练损失:4.558101916313172\n",
      "训练精确度:6.28000020980835%\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(\"训练损失:{}\\n训练精确度:{}%\".format(lossv[-1], accv[-1].item()))\n",
    "plt.figure(figsize=(5,3))\n",
    "plt.plot(np.arange(1,epochs+1), lossv)\n",
    "plt.title('validation loss')\n",
    "plt.savefig('figs/Res2net50_e20_loss.png')\n",
    "\n",
    "plt.figure(figsize=(5,3))\n",
    "plt.plot(np.arange(1,epochs+1), accv)\n",
    "plt.title('validation accuracy')\n",
    "plt.savefig('figs/Res2net50_e20_accuracy.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f196477c-aca2-4c88-bb65-91c3657327af",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
